import tools
from project.hm_03_第三天的代码文件 import myList

# range补充
# 生成1-20之间的数字列表
print(range(1, 21))
list1 = list(range(1, 21))
print(list1)
print("=" * 80)

# 使用for循环遍历一个从1开始到20结束，步长为2的数字序列
for i in range(1, 21, 2):
    # 打印当前遍历到的数字i
    print(i)
print("=" * 80)

for i in range(1, 21, 2):
    print(i)
print("=" * 80)

# _name_变量
print(tools.sum_2_num(2, 3))

# 引用的介绍
a = 10  # 本质是将10的地址给变量a
b = a  # 将a的地址给变量b
print('a', id(a))
print('b', id(b))

b = 20  # 将20的地址给变量b
print('a', id(a))
print('b', id(b))
print("=" * 80)

myList = [1, 2, 3, 4, 5]
list1 = myList  # 将myList的地址给list1
print('myList', id(myList))
print('list1', id(list1))
print("=" * 80)

list1[0] = 100  # 修改list1的第一个元素
print('myList', id(myList))

list1 = [444, 222, 333]
print('myList', id(myList))
print('list1', id(list1))
print("=" * 80)

tuple1 = (1, 2, 3, 4, 5, [1, 2, 3])  # 元组是不可修改的，但是里面的列表可以修改
tuple1[-1][-1] = 9
print(tuple1)
print("=" * 80)


# 局部变量和全局变量
def myFunc():  # 定义一个名为myFunc的函数
    num1 = 100  # 定义一个变量num1并赋值为100
    print(num1)  # 打印变量num1的值


# print(num1)# 未定义名称“num1”
print("=" * 80)

num1 = 10
myFunc()  # num1在函数内部被修改但是在函数外部被定义，则函数内部修改的结果依旧有效
print(num1)
print("=" * 80)


def myFunc2():  # 定义一个名为myFunc2的函数
    num1 = 100  # 定义一个整型变量num1并赋值为100
    print(num1)  # 打印输出num1的值


def myFunc3():  # 定义一个名为myFunc3的函数
    num1 = 200  # 声明一个变量num1并赋值为200
    print(num1)  # 打印变量num1的值


def myFunc4():  # 定义一个名为myFunc4的函数
    global num1  # 声明全局变量num1
    num1 = 300  # 修改全局变量num1的值
    print(num1)  # 打印变量num1的值


print("=" * 80)

if __name__ == '__main__':  # 判断是否是主程序
    num1 = 10
    print(num1)
    myFunc2()
    print(num1)
    myFunc3()
    print(num1)
    myFunc4()  # 调用myFunc4函数，修改全局变量num1的值
    print(num1)
print("=" * 80)


# 函数的进阶
def func(a, b, c):
    print(f"a:{a},b:{b},c:{c}")


# 位置传参
func(1, 2, 3)
print("=" * 80)

# 关键字传参
func(c=3, b=2, a=1)
print("=" * 80)

# 混合使用、
func(1, c=3, b=2)
# func(3,1,a=2)#func（） 为参数 'a' 获得了多个值，因此会报错
print("=" * 80)


# 缺省参数
def show(name, age=18, sex="男"):  # name和sex是缺省参数，必须写在name后面，从age开始是缺省参数
    print(f"姓名：{name},年龄：{age},性别：{sex}")


show("小明", 20, "男")
show("小红")  # 输出默认值
show("小红", 88)
show("小李", sex="女")
print("=" * 80)


# 多值参数（可变参数） 可以接受任意多个位置参数的数据，类型为元组
def myFunc(*args):
    """
    这是一个可变参数函数，可以接受任意数量的位置参数。

    参数:
        *args: 可变数量的位置参数，这些参数会被打包成一个元组(tuple)。

    返回值:
        该函数没有显式返回值，只是打印接收到的参数。
    """
    print(args)  # 打印接收到的所有参数，它们会被自动打包成一个元组


myFunc(1, 2, 3, 4, 5)
myFunc("hello", "world", 222, True)
print("=" * 80)


def myFunc2(a, *args, c=100):
    """
    这是一个自定义函数，用于演示函数参数的使用方法

    参数:
        a: 位置参数，必填
        *args: 可变位置参数，接收任意数量的位置参数，以元组形式存储
        c: 关键字参数，默认值为100

    函数功能:
        打印位置参数a
        打印可变位置参数args
        打印关键字参数c
    """
    print(a)  # 打印位置参数a的值
    print(args)  # 打印可变位置参数args，它是一个元组
    print(c)  # 打印关键字参数c的值，如果未提供则使用默认值100


myFunc2(1, 2, 3, 4, 5, c=10)
myFunc2(2, 11, "agees", 1.12)
print("=" * 80)


# 案例
def ntSum(*args):
    for i in args:
        print("当前数字为：", i)
    return sum(args)


print("结果为：", ntSum(1, 2, 3, 4, 5))
print("=" * 80)

myList = [1, 2, 3, 4, 5]
myTuple = (1, 2, 3, 4, 5)
print("列表和元组的和为：", ntSum(*myList))  # 加*是函数传参过程中的拆包
print("列表和元组的和为：", ntSum(*myTuple))
print("=" * 80)


# 函数返回多个数据值
# 情况一
def myFunc():
    # 定义一个名为myFunc的函数，不带任何参数
    return 1, 2, 3, 4, 5  # 返回一个包含5个元素的元组(1,2,3,4,5)


# 情况2
def myFunc2(a, b, c):
    return a + b + c, a * b * c  # 返回两个值，第一个值为a+b+c，第二个值为a*b*c


# 解决1
a, b, c, d, e = myFunc()
print(a, b, c, d, e)
print("=" * 80)
# 解决2
result = myFunc2(1, 2, 3)
print(result)
print("=" * 80)

# 匿名函数
# lambda表达式
# 定义
# 使用lambda关键字定义一个匿名函数，该函数接受两个参数x和y，返回它们的和
func = lambda x, y: x + y
print(func(1, 2))  # 调用匿名函数，传入参数1和2，并打印结果

# 使用lambda关键字定义另一个匿名函数，该函数接受两个参数x和y，返回它们的乘积
func1 = lambda x, y: x * y
print(func1(2, 3))  # 调用匿名函数，传入参数2和3，并打印结果

# func2=lambda x:x['age']
func2 = lambda x: x.get('age')
person = {'name': '小明', 'age': 18}
print(func2(person))

func3 = lambda x: x[0]
print(func3([1, 2, 3, 4, 5]))
print("=" * 80)

userList = [
    {"name": "小明", "age": 18, "sex": "男"},
    {"name": "小红", "age": 20, "sex": "女"},
    {"name": "小刚", "age": 19, "sex": "男"}
]
# userList.sort()
# print("默认排序的列表：",userList)#报错
userList.sort(key=lambda x: x['name'])
print("按照姓名排序的列表：", userList)
userList.sort(key=lambda x: x['sex'])
print("按照性别排序的列表：", userList)
userList.sort(key=lambda x: x['age'])
print("按照年龄排序的列表：", userList)
print("=" * 80)

List1 = [1, 2, 3, 4, 5]
list2 = ["hello", "world", "python"]
list2.sort()
print(list2)
print("=" * 80)
list2 = ["Hello", "world", "Python"]
list2.sort()
print(list2)
print("=" * 80)
# list2.sort(key=len)
list2.sort(key=lambda x: len(x))
print(list2)  # 按长度排序
print("=" * 80)


# 作业
def func(name, sex='保密'):
    print(f"姓名：{name},性别：{sex}")


func("小明")
func("小红", "女")
print("=" * 80)

list = [
    {"name": "小明", "age": 18, "sex": "男"},
    {"name": "小红", "age": 20, "sex": "女"},
    {"name": "小刚", "age": 19, "sex": "男"}
]


# 根据年龄排序
def func1(list):
    list.sort(key=lambda x: x['age'])
    return list


print(func1(list))
print("=" * 80)

"""
需求：按照以下要求完成代码的编写
第一步：录入学生信息
1)提示用户在控制台输入3个学生的信息，学生信息包含姓名、年龄
2)要求：封装录入单个学生信息的函数，并返回学生的信息
第二步：展示学生列表信息
---
1)封装打印学生信息的函数，格式要求如右图：
第三步：统计学生总数
1)封装获取学生总数的函数，并对该函数进行调用和数据打印
第四步：查询学生信息
1)封装根据学生姓名查询学生信息的函数
2)提示用户“请输入要查询的学生姓名："
3)如果存在，直接在控制台打印学生信息，格式为：“姓名：张三，年龄：25"
4)如果不存在，直接在控制台打印“对不起，名字叫【张三】的学生不存在"
"""
# 创建一个空列表用于存储学生信息
list = []


def input_student():
    """
    输入学生信息的函数
    返回一个包含学生姓名和年龄的字典
    """
    # 获取学生姓名
    name = input("请输入学生姓名：")
    # 获取学生年龄并转换为整数类型
    age = int(input("请输入学生年龄："))
    # 创建学生字典并返回
    student = {"name": name, "age": age}
    return student


def print_student():
    """
    打印所有学生信息的函数
    """
    # 打印表头
    print("------学生信息------")
    # 初始化计数器
    n = 1
    # 遍历列表并打印每个学生信息
    for i in list:
        print(f"{n} {i['name']}\t{i['age']}")
        n += 1
    # 打印表尾
    print("------------------")


def get_student_num():
    """
    获取学生总数的函数
    返回列表长度，即学生数量
    """
    return len(list)


# def search_student():
#     """
#     查询学生信息的函数
#     根据姓名查找学生并打印其信息
#     """
#     # 获取要查询的学生姓名
#     name=input("请输入要查询的学生姓名：")
#     # 遍历列表查找学生
#     for i in list:
#         if i['name']==name:
#             # 找到学生后打印信息并返回
#             print(f"姓名：{i['name']},年龄：{i['age']}")
#             return
#     # 未找到学生时提示
#     print(f"对不起，名字叫【{name}】的学生不存在")

def search_student():
    """
    查询学生信息的函数
    根据姓名查找学生并打印其信息
    """
    # 获取要查询的学生姓名
    name = input("请输入要查询的学生姓名：")
    # 遍历列表查找学生
    for i in list:
        if i['name'] == name:
            # 找到学生后打印信息并返回
            print(f"姓名：{i['name']},年龄：{i['age']}")
            break
    else:
        print(f"对不起，名字叫【{name}】的学生不存在")


if __name__ == '__main__':
    """
    主程序入口
    1. 循环输入3个学生信息
    2. 打印所有学生信息
    3. 显示学生总数
    4. 查询学生信息
    """
    # 循环输入3个学生信息
    for i in range(3):
        student = input_student()
        list.append(student)
    # 打印所有学生信息
    print_student()
    # 获取并打印学生总数
    num = get_student_num()
    print("学生总数：", num)
    # 查询学生信息
    search_student()
